/**
 * @description product 服务层
 * @author LI
 */

const { Product } = require('../db/model/index')
const Op = require('sequelize').Op
const { formatMoreTime } = require('../utils/dateTime')

/**
 * 创建商品产品信息
 * @param {number} goodsInfoId 商品信息 id
 * @param {number} goodsPhotoId 对应商品图片里面的 id
 * @param {string} productSn 产品编号
 * @param {string} productName 产品名称
 * @param {number} productNumber 产品数量
 * @param {number} productPrice 产品单价
 * @param {string} productUnit 产品单位
 * @param {string} photoCoordinate 图片锚点的坐标
 * @param {string} photoDirect 图片锚点图形的说明
 * @param {string} productLink 产品链接
 * @param {string} productRemark 产品备注
 */
async function createProduct({
  goodsInfoId,
  goodsPhotoId,
  productSn,
  productName,
  productNumber,
  productPrice,
  productUnit,
  photoCoordinate,
  photoDirect,
  productLink,
  productRemark,
}) {
  const result = await Product.create({
    goodsInfoId,
    goodsPhotoId,
    productSn,
    productName,
    productNumber,
    productPrice,
    productUnit,
    photoCoordinate,
    photoDirect,
    productLink,
    productRemark,
  })

  return result
}

/**
 * 获取全部商品产品信息
 * @param {number} id 商品图片 id
 * @param {string} productSn 产品编号
 * @param {string} productName 产品名称
 * @param {number} page 第几页
 * @param {number} limit 多少条
 */
async function getProductList({ id, productSn = '', productName = '', page = 1, limit = 10 }) {
  // 拼接查询条件
  let goodsPhotoId = ''
  let result
  if (id) {
    goodsPhotoId = id


  /**
   * 判断是否传 id 执行不同 sql 语句
   * goodsPhotoId: {
   *    [Op.like]: '%' + goodsPhotoId + '%'
   * },
   */
    result = await Product.findAndCountAll({
      limit: limit, // 每页多少条
      offset: limit * (page - 1), // 跳过多少条
      where: {
        goodsPhotoId,
        productName: {
          [Op.like]: '%' + productName + '%'
        },
        productSn: {
          [Op.like]: '%' + productSn + '%'
        }
      }
    })
  } else {
    result = await Product.findAndCountAll({
      limit: limit, // 每页多少条
      offset: limit * (page - 1), // 跳过多少条
      where: {
        productName: {
          [Op.like]: '%' + productName + '%'
        },
        productSn: {
          [Op.like]: '%' + productSn + '%'
        }
      }
    })
  }

  result.rows.map(item => {
    // 格式化时间 多个
    item.dataValues = formatMoreTime(item.dataValues)
  })

  return result
}

/**
 * 更新商品产品信息
 * @param {number} id 商品产品 id
 * @param {string} productName 产品名称
 * @param {number} productNumber 产品数量
 * @param {number} productPrice 产品单价
 * @param {string} productUnit 产品单位
 * @param {string} photoCoordinate 图片锚点的坐标
 * @param {string} photoDirect 图片锚点图形的说明
 * @param {string} productLink 产品链接
 * @param {string} productRemark 产品备注
 */
async function updateProductById({
  id,
  productName,
  productNumber,
  productPrice,
  productUnit,
  photoCoordinate,
  photoDirect,
  productLink,
  productRemark,
}) {
  // 拼接修改内容
  let updateData = {}
  if (productName) {
    updateData.productName = productName
  }
  if (productNumber) {
    updateData.productNumber = productNumber
  }
  if (productPrice) {
    updateData.productPrice = productPrice
  }
  if (productUnit) {
    updateData.productUnit = productUnit
  }
  if (photoCoordinate) {
    updateData.photoCoordinate = photoCoordinate
  }
  if (productLink) {
    updateData.productLink = productLink
  }
  if (photoDirect) {
    updateData.photoDirect = photoDirect
  }
  updateData.productRemark = productRemark
  const result = await Product.update(updateData, {
    where: { id }
  })

  return result[0] > 0
}

/**
 * 通过 id 删除产品信息
 * @param {number} id id
 */
async function deleteProductById(id) {
  const result = await Product.destroy({
    where: { id }
  })

  return result > 0
}

module.exports = {
  createProduct,
  getProductList,
  updateProductById,
  deleteProductById
}
